const express = require('express');
const router = express.Router();

// 实体类
const Response = require('../entity/http/Response');
const Checkin = require('../entity/checkin/Checkin');
const Todo = require('../entity/checkin/Todo');
const ObjId = require('../entity/common/ObjId');

// 业务层
const checkinService = require('../service/checkinService');

/**
 * @接口名称 专注模式打卡接口
 * @待完成 需要设计 反爬虫策略
 * @参数 minutes 专注时长 单位: 分钟
 * @参数详情 minutes 1~120
 */
router.post('/focus', async function(req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /focus 接口`);
    // 读取请求参数
    let { uid } = req.jwtResult.data;
    let checkin = new Checkin(req);
    // 判断参数是否合法
    let flag = checkin.check();
    if (!flag.success) {
        return res.status(400).json(flag);
    }
    console.log(`[log] [req-id=${req.reqId}] 参数校验成功`);
    // 调用业务层
    checkinService.focusCheckIn(uid, checkin).then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("专注模式打卡失败"));
    });
});

/**
 * @接口名称 获取今日专注时长接口
 */
router.get('/focus/today', async function(req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /focus/today 接口`);
    // 读取请求参数
    let { uid } = req.jwtResult.data;
    // 调用业务层
    checkinService.getTodayfocusDuration(uid).then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("专注模式打卡失败"));
    });
});

// /*
//  * 打卡记录统计接口
//  * 返回：总专注时长、日均专注时长、连续打卡几天
//  */
// router.get('/checkinStatistics', async function(req, res, next) {
//     let { uid } = req.jwtResult.data;
//     checkinService.checkinStatistics(uid).then((result) => {
//         res.status(result.success ? 200 : 400).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("获取打卡记录统计失败"));
//     });
// });

// /*
//  * 排行榜接口
//  * 返回：前100的名次
//  */
// router.get('/checkinRanking', async function(req, res, next) {
//     let { uid } = req.jwtResult.data;
//     checkinService.checkinRanking(uid).then((result) => {
//         res.status(result.success ? 200 : 400).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("获取专注排行榜失败"));
//     });
// });

// /*
//  * 打卡记录趋势接口
//  * 返回：最近7天的打卡记录
//  */
// router.get('/checkinTrend', async function(req, res, next) {
//     let { uid } = req.jwtResult.data;
//     checkinService.checkinTrend(uid).then((result) => {
//         res.status(result.success ? 200 : 400).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("获取打卡记录趋势失败"));
//     });
// });

// /*
//  * 获取主页的用户打卡统计信息
//  */
// router.get('/getMainPageNeedInfo', async function(req, res, next) {
//     let { uid } = req.jwtResult.data;
//     checkinService.getMainPageNeedInfo(uid).then((result) => {
//         res.status(result.success ? 200 : 400).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("获取主页的用户打卡统计信息失败"));
//     });
// });

// /**
//  * @接口名称 每日打卡接口
//  */
// router.post('/dailyCheckin', async function(req, res, next) {
//     // 读取请求参数
//     let { uid } = req.jwtResult.data;
//     // 调用业务层
//     checkinService.dailyCheckin(uid).then((result) => {
//         res.status(result.code).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("每日打卡失败"));
//     });
// });

// /**
//  * @接口名称 获取每日打卡连续天数接口
//  */
// router.get('/dailyCheckin/continuousDays', async function(req, res, next) {
//     // 读取请求参数
//     let { uid } = req.jwtResult.data;
//     // 调用业务层
//     checkinService.getDailyCheckinContinuousDays(uid).then((result) => {
//         res.status(result.code).json(result);
//     }).catch((err) => {
//         res.status(500).json((new Response()).fail("每日打卡失败"));
//     });
// });

/**
 * 创建待办事项
 */
router.post('/addTodo', async function (req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /addTodo 接口`);
    let uid = req.jwtResult.data.uid;
    let todo = new Todo(req.body);
    let flag = todo.check();
    if (!flag.success) {
        return res.status(400).json(flag);
    }
    console.log(`[log] [req-id=${req.reqId}] 参数校验成功`);
    checkinService.addTodo(uid, todo).then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("创建待办事项失败"));
    });
});

/**
 * 获取所有待办事项
 */
router.get('/todos', async function (req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /todos 接口`);
    let uid = req.jwtResult.data.uid;
    checkinService.getAllTodos(uid).then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("获取所有待办事项"));
    });
});

/**
 * 标记待办事项完成接口
 */
router.put('/done', async function (req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /done 接口`);
    let uid = req.jwtResult.data.uid;
    let todo = new ObjId(req.body, 'id');
    let flag = todo.check();
    if (!flag.success) {
        return res.status(400).json(flag);
    }
    console.log(`[log] [req-id=${req.reqId}] 参数校验成功`);
    checkinService.setTodoStatus(uid, todo.id, '已完成').then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("完成待办事项失败"));
    });
});

/**
 * 标记待办事项未完成接口
 */
router.put('/todo', async function (req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /todo 接口`);
    let uid = req.jwtResult.data.uid;
    let todo = new ObjId(req.body, 'id');
    let flag = todo.check();
    if (!flag.success) {
        return res.status(400).json(flag);
    }
    console.log(`[log] [req-id=${req.reqId}] 参数校验成功`);
    checkinService.setTodoStatus(uid, todo.id, '待完成').then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("完成待办事项失败"));
    });
});

/**
 * 删除待办事项接口
 */
router.delete('/todo', async function (req, res, next) {
    console.log(`[log] [req-id=${req.reqId}] 进入了 /todo 接口`);
    let uid = req.jwtResult.data.uid;
    let todo = new ObjId(req.body, 'id');
    let flag = todo.check();
    if (!flag.success) {
        return res.status(400).json(flag);
    }
    console.log(`[log] [req-id=${req.reqId}] 参数校验成功`);
    checkinService.deleteTodo(uid, todo.id).then((result) => {
        console.log(`[log] [req-id=${req.reqId}] 响应 result`, result);
        res.status(result.code).json(result);
    }).catch((err) => {
        console.log(`[log] [req-id=${req.reqId}] 服务器错误`, err);
        res.status(500).json((new Response()).fail("完成待办事项失败"));
    });
})

module.exports = router;
